package net.sansi.v3correctserver.exception;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import net.sansi.v3correctserver.dto.R;
import net.sansi.v3correctserver.util.I18nUtil;

/**
 * Created by Fang
 * create time : 2023/12/21
 * IDE : IntelliJ IDEA
 * <p>
 * 通用异常类
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class ServiceException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    // 常用返回码
    private int code;
    // 消息，一般是错误信息
    private String message;

    /**
     * 空构造函数
     */
    public ServiceException() {
        super();
    }

    /**
     * 构造函数
     * 可初始化错误信息
     *
     * @param message 错误信息
     */
    public ServiceException(String message) {
        this.code = R.ERROR;
        this.message = message;
    }

    /**
     * 构造函数
     * 可初始化错误信息
     * 可格式化字符串
     *
     * @param format 格式化字符串
     * @param params 参数
     */
    public ServiceException(String format, Object... params) {
        this.code = R.ERROR;
        this.message = StrUtil.format(format, params);
    }

    /**
     * 设置国际化消息
     *
     * @param i18nKey 国际化key
     * @param params  参数
     * @return this
     */
    public ServiceException setI18nMessage(String i18nKey, Object... params) {
        this.code = R.ERROR;
        this.message = I18nUtil.get(i18nKey, params);
        return this;
    }

    /**
     * 直接返回国际化异常
     *
     * @param i18nKey 国际化key
     * @param params  参数
     * @return ServiceException
     */
    public static ServiceException i18n(String i18nKey, Object... params) {
        return new ServiceException().setI18nMessage(i18nKey, params);
    }
}
